# _*_conding:cp-1252-*-
# 教育机构：银杰教育
# 讲师：李伟
# 开发时间：2025/8/28 下午9:49
"""
属性： 类属性 和实例属性 【特征和状态-天生的五官 手足；后天的-肤色，双眼皮，面容，性格】
- 之前类属性和实例属性都是提前定义好了，这种就需要提前设计的时候就知道这个值是多少；
- 但是再工作中有些属性没有办法提前知道，中间过程产生的数据。
    - 比如： 登录之后接口鉴权，token /cookies 【每次登录刷新 过期时间】
    - 比如注册用户名和手机号不能重复使用，不能提前写死，随机生成之后 动态传参。
      - 【类比Jmeter的random，python的faker】，随机生成的， 不能提前知道。

没有办法提前设定好的一些属性，需要后天动态生成属性和值。=== 动态属性。

动态属性【反射】:就是用来给类或者对象设置属性/获取属性/删除属性/判断是否有属性。== 四个方法：内置函数
1）设置属性：setattr( 对象/类，属性名，属性值)  ==重点
  - 属性名需要是字符串类型
  - 新增这个属性名字 -静态代码不能识别 会有提示，但是动态运行起来了之后就可以识别，所以不会报错的。
2）获取属性：getattr(对象/类，属性名)  ==了解
3）判断是否存在属性：hasattr(对象/类，属性名) ==知道
  - 结果是布尔值： True  False
  - 可以用来多if判断条件
  - 使用场景： 如果代码里需要使用某个属性，可以先做一个判断是否存在这个属性，再获取使用。避免报错。
4）删除属性: delattr(对象/类，属性名)  --了解
   - 用的比较少 了解即可。

"""

# 1）设置属性：setattr( 对象/类，属性名，属性值) ，新增或者修改属性 ==用的最多
class Car:
    wheel = "True"
    engine = "True"
    def __init__(self,cl="黑色",lg="法拉利"): # 参数- 形参,变量，跟属性名没有任何关系
        self.color = cl  # 实例属性，实例方法里可以调用-共享
        self.logo = lg
        print("正在生成一辆车...")

# # 实例化对象 -取名字 -name
my_car = Car()
setattr(my_car,"name","小可爱")  # 动态设置属性name="小可爱” -实例属性
print(my_car.color)
print(my_car.name)  #新增这个属性名字 -静态代码不能识别 会有提示，但是动态运行起来了之后就可以识别，所以不会报错的。
print(my_car.__dict__)  # 查看实例所有的属性 确认是否设置属性成功

 # 设置类的属性
setattr(Car,"name","大可爱")
print(Car.__dict__) # 查看类所有的属性 确认是否设置属性成功

# # 2）获取属性：getattr(对象/类，属性名)
print(getattr(Car, "name")) # 属性名存在的，直接返回属性值
# print(getattr(Car, "age")) # 属性名不存在的，直接报错：AttributeError: type object 'Car' has no attribute 'age'
print(getattr(my_car,"name"))
# # 3）判断是否存在属性：hasattr(对象/类，属性名)
print(hasattr(Car, "age"))
if hasattr(Car, "age"):
    getattr(Car,"age")
else:
    setattr(Car,"age","3")
    print(getattr(Car,"age"))

# # 4）删除属性: delattr(对象/类，属性名) --
print(Car.__dict__)
delattr(Car,"age")
print(Car.__dict__)
#